/**
 * 网络请求封装
 * 处理API请求、Token管理、错误处理
 */

// 导入配置
const { getConfig } = require('./config.js')

// 配置信息
const config = {
  // 后台管理系统API基础URL
  baseURL: getConfig('api.baseURL'),
  
  // 请求超时时间
  timeout: getConfig('api.timeout'),
  
  // 默认请求头
  defaultHeaders: {
    'Content-Type': 'application/json'
  }
}

/**
 * 获取存储的Token
 */
function getToken() {
  return wx.getStorageSync('access_token') || ''
}

/**
 * 设置Token
 */
function setToken(token) {
  wx.setStorageSync('access_token', token)
}

/**
 * 清除Token
 */
function clearToken() {
  wx.removeStorageSync('access_token')
  wx.removeStorageSync('user_info')
}

/**
 * 获取用户信息
 */
function getUserInfo() {
  return wx.getStorageSync('user_info') || null
}

/**
 * 设置用户信息
 */
function setUserInfo(userInfo) {
  wx.setStorageSync('user_info', userInfo)
}

/**
 * 封装的请求方法
 */
function request(options) {
  return new Promise((resolve, reject) => {
    // 显示加载提示
    if (!options.hideLoading) {
      wx.showLoading({
        title: options.loadingTitle || '请求中...',
        mask: true
      })
    }
    
    // 构建完整URL
    const url = options.url.startsWith('http') ? options.url : config.baseURL + options.url
    
    // 构建请求头
    const headers = {
      ...config.defaultHeaders,
      ...options.headers
    }
    
    // 添加Token
    const token = getToken()
    if (token) {
      headers['Authorization'] = `Bearer ${token}`
    }
    
    // 发起请求
    wx.request({
      url: url,
      method: options.method || 'GET',
      data: options.data || {},
      header: headers,
      timeout: options.timeout || config.timeout,
      success: (res) => {
        // 隐藏加载提示
        if (!options.hideLoading) {
          wx.hideLoading()
        }
        
        // 处理响应
        handleResponse(res, resolve, reject, options)
      },
      fail: (error) => {
        // 隐藏加载提示
        if (!options.hideLoading) {
          wx.hideLoading()
        }
        
        console.error('网络请求失败:', error)
        
        // 显示错误提示
        if (!options.hideError) {
          wx.showToast({
            title: '网络连接失败',
            icon: 'error'
          })
        }
        
        reject({
          code: -1,
          message: '网络连接失败',
          error: error
        })
      }
    })
  })
}

/**
 * 处理响应结果
 */
function handleResponse(res, resolve, reject, options) {
  const { statusCode, data } = res
  
  // HTTP状态码检查
  if (statusCode >= 200 && statusCode < 300) {
    // 业务状态码检查
    if (data.code === 200 || data.code === 0 || data.success === true) {
      // 请求成功
      resolve(data)
    } else if (data.code === 401) {
      // Token过期或未授权
      handleAuthError(options)
      reject(data)
    } else {
      // 业务错误
      console.error('业务请求失败:', data)
      
      if (!options.hideError) {
        wx.showToast({
          title: data.message || '请求失败',
          icon: 'error'
        })
      }
      
      reject(data)
    }
  } else {
    // HTTP错误
    console.error('HTTP请求失败:', res)
    
    if (!options.hideError) {
      wx.showToast({
        title: `请求失败(${statusCode})`,
        icon: 'error'
      })
    }
    
    reject({
      code: statusCode,
      message: `HTTP错误: ${statusCode}`,
      data: data
    })
  }
}

/**
 * 处理认证错误
 */
function handleAuthError(options) {
  console.log('Token过期，清除本地数据')
  
  // 清除本地数据
  clearToken()
  
  // 如果不是静默请求，提示用户重新登录
  if (!options.silent) {
    wx.showModal({
      title: '登录过期',
      content: '您的登录已过期，请重新登录',
      showCancel: false,
      confirmText: '重新登录',
      success: () => {
        // 跳转到登录页
        wx.reLaunch({
          url: '/pages/login/login'
        })
      }
    })
  }
}

/**
 * GET请求
 */
function get(url, params = {}, options = {}) {
  return request({
    url: url,
    method: 'GET',
    data: params,
    ...options
  })
}

/**
 * POST请求
 */
function post(url, data = {}, options = {}) {
  return request({
    url: url,
    method: 'POST',
    data: data,
    ...options
  })
}

/**
 * PUT请求
 */
function put(url, data = {}, options = {}) {
  return request({
    url: url,
    method: 'PUT',
    data: data,
    ...options
  })
}

/**
 * DELETE请求
 */
function del(url, params = {}, options = {}) {
  return request({
    url: url,
    method: 'DELETE',
    data: params,
    ...options
  })
}

/**
 * 文件上传
 */
function upload(url, filePath, formData = {}, options = {}) {
  return new Promise((resolve, reject) => {
    // 显示上传进度
    if (!options.hideLoading) {
      wx.showLoading({
        title: '上传中...',
        mask: true
      })
    }
    
    // 构建完整URL
    const fullUrl = url.startsWith('http') ? url : config.baseURL + url
    
    // 构建请求头
    const headers = {
      ...options.headers
    }
    
    // 添加Token
    const token = getToken()
    if (token) {
      headers['Authorization'] = `Bearer ${token}`
    }
    
    wx.uploadFile({
      url: fullUrl,
      filePath: filePath,
      name: options.name || 'file',
      formData: formData,
      header: headers,
      success: (res) => {
        if (!options.hideLoading) {
          wx.hideLoading()
        }
        
        try {
          const data = JSON.parse(res.data)
          if (data.code === 200 || data.code === 0 || data.success === true) {
            resolve(data)
          } else {
            console.error('文件上传失败:', data)
            if (!options.hideError) {
              wx.showToast({
                title: data.message || '上传失败',
                icon: 'error'
              })
            }
            reject(data)
          }
        } catch (error) {
          console.error('解析上传响应失败:', error)
          reject({
            code: -1,
            message: '解析响应失败',
            error: error
          })
        }
      },
      fail: (error) => {
        if (!options.hideLoading) {
          wx.hideLoading()
        }
        
        console.error('文件上传失败:', error)
        if (!options.hideError) {
          wx.showToast({
            title: '上传失败',
            icon: 'error'
          })
        }
        reject(error)
      }
    })
  })
}

// 导出模块
module.exports = {
  config,
  request,
  get,
  post,
  put,
  delete: del,
  upload,
  getToken,
  setToken,
  clearToken,
  getUserInfo,
  setUserInfo
} 